package src;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Calendar;

public class ListeOrdres {
	private ArrayList<Ordre> ordres = new ArrayList<Ordre>();
	
	public void add(Ordre ordre)
	{
		if(ordres.isEmpty()){
			this.ordres.add(ordre);
		} else {
			int i = 0;
			while(i<ordres.size() && ordres.get(i).PlusTot(ordre.getTemps())){
				i++;
			}
			if(i == ordres.size()){
				ordres.add(ordre);
			} else {
				ordres.add(i,ordre);
			}
		} 
	}

	public int size()
	{
		return this.ordres.size();
	}
	
	public Ordre get(int i)
	{
		return ordres.get(i);
	}
	
	public void set(int i, Ordre o)
	{
		ordres.set(i,o);
	}
	
	public void Echange(int i, int j)
	{
		Ordre s = ordres.get(i);
		ordres.set(i,ordres.get(j));
		ordres.set(j,s);
	}
	public boolean contains(Ordre o)
	{
		return ordres.contains(o);
	}
	
	public ListeOrdres trifusion(boolean decroissant)
	{
		ListeOrdres res = this;
		if(res.isEmpty())
		{
			return null;
		}
		if(res.size()== 1)
		{
			return res;
		}
		if(res.size()== 2)
		{
			if(decroissant)
			{
				if(res.get(0).getPrix() < res.get(1).getPrix())
				{
					res.Echange(0,1);
					return res;
				} else {return res;}
			} else
			{
				if(res.get(0).getPrix() > res.get(1).getPrix())
				{
					res.Echange(0,1);
					return res;
				} else {return res;}
			}
		} else
		{
			int lim = res.size()/2;
			if(lim == 0){lim = 1;} //Pour les listes de 1.
			ListeOrdres sub1 = res.sub(0,lim);
			ListeOrdres sub2 = res.sub(lim, res.size()-lim);
			return res.fusion(sub1.trifusion(decroissant),sub2.trifusion(decroissant),decroissant);
		}
	}
	
	private ListeOrdres sub(int debut, int longueur)
	{
		ListeOrdres res = new ListeOrdres();
		for(int i =debut;i<debut+longueur;i++)
		{
			res.add(this.ordres.get(i));
		}
		return res;
	}
	
	private ListeOrdres fusion(ListeOrdres sub1,ListeOrdres sub2, boolean decroissant)
	{
		ListeOrdres res = new ListeOrdres();
		int i = 0;
		int j = 0;
		while(j<sub2.size() && i<sub1.size())
		{
			if(decroissant)
			{
				if(sub1.get(i).getPrix() < sub2.get(j).getPrix())
				{
					res.add(sub2.get(j));
					j++;
				} else
				{
					res.add(sub1.get(i));
					i++;
				}
			} else
			{
				if(sub1.get(i).getPrix() > sub2.get(j).getPrix())
				{
					res.add(sub2.get(j));
					j++;
				} else
				{
					res.add(sub1.get(i));
					i++;
				}
			}
		}
		if(j<sub2.size())
		{
			for(int k = j;k<sub2.size();k++)
			{
				res.add(sub2.get(k));
			}
		}
		if(i<sub1.size())
		{
			for(int k = i;k<sub1.size();k++)
			{
				res.add(sub1.get(k));
			}
		}
		return res;
	}

	@Override
	public String toString() {
		return "ListeOrdres [ordres=" + ordres + "]";
	}
	
	public boolean isEmpty(){
		return ordres.isEmpty();
	}
	
	public ListeOrdres recupOrdres(Calendar temps, boolean croissant)
	{
		ListeOrdres res = new ListeOrdres();
		int i = 0;
		if(croissant == true)
		{
			while(i<size() && get(i).PlusTot(temps))
			{
				res.add(get(i));
				i++;
			}
		} else
		{
			while(i<size() && get(i).PlusTard(temps))
			{
				res.add(get(i));
				i++;
			}
		}
		return res;
	}
	
	public void DelOrdre(Ordre o)
	{
		ordres.remove(ordres.indexOf(o));
	}
	
	public ListeOrdres majOrdres(ListeOrdres nouvelle,Calendar temps)
	{
		ListeOrdres res = recupOrdres(temps,false);
		if(!nouvelle.isEmpty())
		{
			for(int i=0;i<nouvelle.size();i++)
			{
				res.add(nouvelle.get(i));
			}
		}
		return res;
	}
	
	public ArrayList<Ordre> getListe(){
		return ordres;
	}
}
